package com.proxy.dynamicProxy;

import org.springframework.beans.factory.annotation.Qualifier;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理的好处：
 *
 * 可以使真实角色的操作更加纯粹！不用去关注一些公共的业务
 * 公共角色就交给代理角色！实现了业务的分工！
 * 公共业务发生扩展的时候，方便集中管理！
 * 一个动态代理类代理的是一个接口，一般就是对应的一类业务
 * 一个动态代理类可以代理多个类，只要是实现了同一个接口即可！
 */

//动态代理类
public class ProxyInvocationHandler implements InvocationHandler {
    private Object target; //被代理的接口
    public void setTarget(Object target) {
        this.target = target;
    }
    //生成得到代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                target.getClass().getInterfaces(),this);
    }

    public ProxyInvocationHandler(Object object) {
       this.target = object;
    }

    //处理代理实例，并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //动态代理的本质，就是使用反射机制实现！
        Object result = method.invoke(target, args);
            seeHose();
            fee();
        return result;
    }

    public void seeHose(){
        System.out.println("中介带着看房子！");
    }

    public void fee(){
        System.out.println("中介收取费用！");
    }
}
